package com.fbinggun.fbinggunutil.gui;

import com.fbinggun.fbinggunutil.API.BukkitUtil;
import com.fbinggun.fbinggunutil.API.ItemUtil;
import com.fbinggun.fbinggunutil.API.PApiUtil;
import com.fbinggun.fbinggunutil.price.IPrice;
import com.fbinggun.fbinggunutil.utilclass.Variable;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.entity.Player;
import org.bukkit.event.inventory.InventoryClickEvent;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack;
import org.bukkit.plugin.java.JavaPlugin;

import java.util.ArrayList;
import java.util.List;

/**
 * 按钮物品父类 创建按钮时 继承或直接使用此类
 */
public class SlotItem {
    /**
     * 配置文件:
     * id1:
     *  Item:
     *   Type: ENDER_CHEST
     *   Name: "&a物品"
     *   Lore:
     *    - "&a介绍"
     *  #点击类型
     *  clickType: SHIFT_LEFT
     *  #格子位置 可Slot: 0 或者以List格式
     *  Slot:
     *   - 0
     *  #价格配置
     *  Price:
     *   PriceType: Money
     *   Price: 100
     *  Command:
     *   - give %player STONE 1
     *  #显示此按钮的权限
     *  permission: xxx.xx
     *  #成功运行的消息
     *  Message: 运行成功
     *  #失败运行的消息
     *  MessageFail: 你没有足够的游戏币
     *  #运行后是否关闭菜单
     *  Close: true
     */
    ConfigurationSection configItem;
    List<Integer> slotList=new ArrayList<>();
    IPrice price;
    List<String> command= new ArrayList<>();
    String clickType;
    String permission;
    String message;
    String messageFail;
   public boolean close=false;
    String id;
    public SlotItem(String id,ConfigurationSection config) {
        if(config==null) {
            return;
        }
        this.id=id;
        this.configItem = config.getConfigurationSection("Item");
        clickType=config.getString("clickType");

        if(config.isList("Slot")){
            List<String> slotStr= config.getStringList("Slot");
            for(String str:slotStr){
                slotList.add(Integer.valueOf(str));
            }
        }else {
            slotList.add(config.getInt("Slot"));
        }
        price= IPrice.loadPrice(config.getConfigurationSection("Price"));
        command=config.getStringList("Command");
        permission=config.getString("permission");
        message=config.getString("Message");
        messageFail=config.getString("MessageFail");
        close=config.getBoolean("Close");
    }

    /**
     * 获取物品配置文件
     * @return
     */
    public ConfigurationSection getConfigItem() {
        return configItem;
    }

    /**
     * 获取格子位置（第一个位置)
     * @return
     */
    public int getSlot() {
        return slotList.get(0);
    }

    /**
     * 获取格子位置集合
     * @return
     */
    public List<Integer> getSlotList() {
        return slotList;
    }

    /**
     * 获得价格 可能为空
     * @return
     */
    public IPrice getPrice() {
        return price;
    }

    /**
     * 获得指令 可能为空
     * @return
     */
    public List<String> getCommand() {
        return command;
    }

    /**
     * 获得点击类型 可能为空
     * @return
     */
    public String getClickType() {
        return clickType;
    }
    /**
     * 获得权限条件 可能为空
     * @return
     */
    public String getPermission() {
        return permission;
    }
    /**
     * 获得运行后的消息 可能为空
     * @return
     */
    public String getMessage() {
        return message;
    }
    /**
     * 获得运行失败后的消息 可能为空
     * @return
     */
    public String getMessageFail() {
        return messageFail;
    }
    /**
     * 获得运行后是否关闭菜单 默认不关闭
     * @return
     */
    public boolean isClose() {
        return close;
    }
    /**
     * 获得这个按钮的ID
     * @return
     */
    public String getId() {
        return id;
    }

    /**
     * 获得这个按钮的物品
     * @param player 玩家 用于替换玩家变量 可为空
     * @param variable 本地替换变量
     * @return
     */
    public ItemStack getItem(Player player, Variable... variable){
        ItemStack itemStack = ItemUtil.getItemStack(configItem,variable);
        if(itemStack!=null){
            itemStack=PApiUtil.setPlaceholder(itemStack,player);
        }
        return itemStack;
    }

    /**
     * 获得这个按钮的物品
     * @param player 玩家 用于替换玩家变量 可为空
     * @return
     */
    public ItemStack getItem(Player player){
        return getItem(player,null);
    }

    /**
     * 运行指令 并判断是否满足运行条件
     * @param player 玩家
     * @param plugin 运行指令的插件
     */
    public void run(Player player, JavaPlugin plugin){
        run(player,null,plugin);
    }

    public void run(Player player, InventoryClickEvent event, JavaPlugin plugin){
        run(player,event,plugin,null);
    }

    /**
     * 运行指令 并判断是否满足运行条件
     * @param player 玩家
     * @param event 点击监听器 用于判断点击类型
     * @param plugin 运行指令的插件
     */
    public void run(Player player, InventoryClickEvent event, JavaPlugin plugin,FHolder fHolder){
        if(event!=null){
            if(clickType!=null){
            if(!event.getClick().name().equals(clickType)){
//                if(getMessageFail()!=null) {
//                    player.sendMessage(PApiUtil.setPlaceholders(player, getMessageFail()));
//                }
                return;
            }
            }
        }
        if(permission!=null){
            if(player.hasPermission(permission)){
            }else {
                if(getMessageFail()!=null) {
                    player.sendMessage(PApiUtil.setPlaceholders(player, getMessageFail()));
                }
                return;
            }
        }
        if(price!=null){
            if(price.has(player)){
                price.take(player);
                if(command!=null&&command.size()!=0){
                    BukkitUtil.runCommands(command,player,plugin);
                }
                if(isClose()){
                    player.closeInventory();
                }
                if(getMessage()!=null) {
                    player.sendMessage(PApiUtil.setPlaceholders(player, getMessage()));
                }
                return;
            }else {
                if(getMessageFail()!=null) {
                    player.sendMessage(PApiUtil.setPlaceholders(player, getMessageFail()));
                }
            }
            return;
        }else {
            if(isClose()){
                player.closeInventory();
            }
            if(command!=null&&command.size()!=0){
                BukkitUtil.runCommands(command,player,plugin);
            }
            if(getMessage()!=null) {
                player.sendMessage(PApiUtil.setPlaceholders(player, getMessage()));
            }
        }
    }

    /**
     * 将这个按钮设置到容器
     * @param player 玩家名 用于替换玩家变量
     * @param inventory 要设置的容器
     * @param variable 本地变量
     * @return
     */
    public Inventory setInv(Player player, Inventory inventory,Variable... variable){
        if(slotList!=null&&slotList!=null){
            for(int x:slotList){
                if(permission!=null) {
                    if (!player.hasPermission(getPermission())){
                        return inventory;
                    }
                }
                inventory.setItem(x,getItem(player,variable));
            }
        }
        return inventory;
    }
    /**
     * 将这个按钮设置到容器
     * @param player 玩家名 用于替换玩家变量
     * @param inventory 要设置的容器
     * @return
     */
    public Inventory setInv(Player player, Inventory inventory){
          return   setInv(player,inventory,null);
    }


}
